package main

import (
	"fmt"
	"sort"
)

func main() {
	//1. 对于整数数组排序
	nums := []int{3, 2, 4, 1, 4, 7, 6}
	sort.Ints(nums)
	fmt.Println(nums) //[1 2 3 4 4 6 7]

	//2. 对于字符串数组排序
	strs := []string{"sdclone", "xyt", "sdcl2", "abc", "dnf"}
	sort.Strings(strs)
	fmt.Println(strs) //[abc dnf sdcl2 sdclone xyt]

	//3. 对于浮点数类型排序
	floats := []float64{12.3, 31.31, 312.2, 1.1, 43, 2}
	sort.Float64s(floats)
	fmt.Println(floats) //[1.1 2 12.3 31.31 43 312.2]

	// 4.查找一个int在排序数组中的索引
	s4 := [...]int{2, 3, 452, 1, 3, 4, 5, 67}
	index := sort.SearchInts(s4[:], 3)
	fmt.Println(index) //如果有多个，只返回第一个		//1

	// 5.查找一个string在数组中的位置
	s5 := [...]string{"mashiro", "satori", "hatsunemiku"}
	index1 := sort.SearchStrings(s5[:], "mashiro")
	fmt.Println(index1) //0

	//6. 使用Reverse和IntSlice对于数组逆序(正序)排序
	nums2 := []int{3, 4, 6, 5, 4, 9, 7}
	sort.Sort(sort.Reverse(sort.IntSlice(nums2)))
	fmt.Println(nums2) //[9 7 6 5 4 4 3]
	sort.Sort(sort.IntSlice(nums2))
	fmt.Println(nums2) //[3 4 4 5 6 7 9]

	//7. 使用sort.Slice(arr, func())对于任何类型进行排序（类似于java的 Arrays.sort(arr, func())）
	// 函数返回true，表示idx1和idx2不用交换；函数返回false，表示idx1和idx2需要交换
	str := "sdclone"
	bytes := []byte(str)
	fmt.Println("unsorted bytes, ", bytes)
	sort.Slice(bytes, func(idx1, idx2 int) bool {
		return bytes[idx1] < bytes[idx2]
	})
	for _, ch := range bytes {
		fmt.Print(string(ch), " ")
	}
	fmt.Println()
}
